﻿using System;
using System.Collections.Generic;
using System.Text;


namespace HAVNet.CoreTesting
{
    class Point
    {
        public int x, y;
    }

    class PruebaStatements
    {
        void pruebaBlock()
        {
            { }
        }

        void pruebaSemicolon()
        {
            ;
        }

        void pruebaCheckedyUnchecked()
        {
            checked { }
            unchecked { }
        }

        void pruebaStatementExpression(int valor)
        {
            valor = valor + 1; // es un statement, pero tambien es una expresión :)
        }

        int pruebaIf(int x)
        {
            if (x == 28146297)
                return 0;

            if (x == 1)
                return 23;
            else
                return 17;
        }

        void pruebaSwitch(int x)
        {
            /* realmente una fucking bola de gotos */
            switch (x)
            {
                case 1:
                    goto default;
                case 2:
                    goto case 1;
                case 3:
                case 4:
                    break;
                default:
                    return;
            }
        }

        IEnumerable<int> pruebaWhile()
        {
            while (true)
            {
                yield return 1;
            }
        }

        IEnumerable<int> pruebaDo()
        {
            do
            {
                yield return 1;
            } while (true);
        }

        IEnumerable<int> pruebaFor()
        {
            for (int i = 0; i < 10; ++i)
                yield return i;
        }

        IEnumerable<int> pruebaForEach()
        {
            foreach (int ix in pruebaFor())
                yield return ix;
        }

        void pruebaGoTo()
        {
            goto pipo;

        pipo:
            return;
        }

        void pruebaLock()
        {
            lock (this)
                ;
        }

        void pruebaReturn1()
        {
            return;
        }

        int pruebaReturn2()
        {
            return 123;
        }

        void pruebaThrow()
        {
            throw new Exception("ayayay mamacita!");
        }

        IEnumerable<int> pruebaYield()
        {
            yield return 1;
            yield return 2;
            yield return 3;
            yield break;
        }

        void pruebaUsing()
        {
            using (System.IO.FileStream fs = new System.IO.FileStream("po", System.IO.FileMode.Create))
                fs.Close();
        }

        void pruebaTryCatch()
        {
            try
            {
                int a = 10;
                a -= 2;
                a = 10 / a;
            }
            catch (NotFiniteNumberException nfne)
            {
                Console.WriteLine("que mierda!");
                throw nfne;
            }
            catch (Exception)
            {
                Console.WriteLine("otra except!");
            }
            finally
            {
                Console.WriteLine("finally");
            }
        }

        unsafe static void pruebaFixed()
        {
            Point pt = new Point();
            pt.x = 5;
            pt.y = 6;

            // Pin pt in place:
            fixed (int* p = &pt.x, q = &pt.y)
            {
                squarePtrParam(p);
                squarePtrParam(q);
            }

            // pt now unpinned
            Console.WriteLine("{0} {1}", pt.x, pt.y);
        }

        unsafe static void squarePtrParam(int* p)
        {
            *p *= *p;
        }


        public void pruebaVarLocal()
        {
            int a = 10;
            int b = 11, c = 12;
        }


        public void pruebaConstLocal()
        {
            const int a = 10;
            const int b = 11, c = 12;
        }


        bool abrirSam(int tipo, ref string error)
        {
            int x = 0;
            ++x;

            int nroSam = 0;

            if (tipo == 1) nroSam = 1;
            if (tipo == 2) nroSam = 2;

            if (0 == error.Length && !true)
                error = string.Format("No se puede abrir el SAM nro. {0}", nroSam);

            return (0 == error.Length);
        }
    }
}


